package com.seeyon.apps.kkSample.utils;

import com.seeyon.ctp.common.AppContext;
import com.seeyon.ctp.common.service.NeedlessCheckLoginAnnotationAware;

import java.lang.reflect.Method;
import java.util.LinkedHashSet;
import java.util.Set;

/**
 * 实现指定controller免认证 不用去修改ctp-core包下的needless_check_login.xml配置文件
 */
public class ExemptAuthUtil {

    /**
     * 初始化免认证方法 这个方法最好使用懒加载机制执行，否则可能出现初始化失败的情况
     *
     * @param <T> type 需要初始化的类
     * @return 初始化完成返回true
     * @throws Exception 初始化失败直接抛出异常
     */
    public static <T> boolean initDismissAuthenticationMethod(Class<T> type) throws Exception {
        NeedlessCheckLoginAnnotationAware needless = (NeedlessCheckLoginAnnotationAware) AppContext.getBean("NeedlessCheckLoginAnnotationAware");
        if (null != needless) {
            Set<String> methods = new LinkedHashSet<String>();
            {
                Method[] ms = type.getMethods();
                Method[] dms = type.getDeclaredMethods();
                for (Method m : ms) {
                    for (Method dm : dms) {
                        if (m.getName().equals(dm.getName())) {
                            methods.add(dm.getName());
                        }
                    }
                }
            }
            // put key：spring.xml文件里配置的beanName名字，value：bean的所有公共方法
            needless.getNeedlessUrlMap().put(AppContext.getBeansOfType(type).keySet().iterator().next(), methods);
            return true;
        } else {
            throw new Exception("Failed to initialize NeedlessCheckLogin method");
        }
    }

    /**
     * 初始化免认证方法
     *
     * @param beanName Spring.xml里配置的Controller的name名字例如：/third.do
     * @param methods  免认证的方法名集合
     * @return 成功返回 true
     * @throws Exception 失败直接抛异常
     */
    public static boolean initDismissAuthenticationMethod(String beanName, Set<String> methods) throws Exception {
        NeedlessCheckLoginAnnotationAware needless = (NeedlessCheckLoginAnnotationAware) AppContext.getBean("NeedlessCheckLoginAnnotationAware");
        if (null != needless) {
            // put key：spring.xml文件里配置的beanName名字，value：bean的所有公共方法
            needless.getNeedlessUrlMap().put(beanName, methods);
            return true;
        } else {
            throw new Exception("Failed to initialize NeedlessCheckLogin method");
        }
    }
}
